/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio;

import BaseDatos.GestorBD;
import Util.Varios;
import java.util.Date;
import java.util.Vector;

/**
 *
 * @author Javi
 */
public class Cliente implements ObjetoDatos{
    //Nombre de la tabla de la Base de Datos
    private String _sNombreTabla = "Clientes";
    //Descripción de la tabla de la Base de Datos
    private String _sDescripTabla = "Clientes";
    
    //Objetos de los que se compone el objeto cliente
    private ClienteDatPers _oClienteDatPers = new ClienteDatPers();
    private ClienteDatSoc _oClienteDatSoc = new ClienteDatSoc();
    private ClienteDatSocEco _oClienteDatSocEco = new ClienteDatSocEco();
    private ClienteHob _oClienteHob = new ClienteHob();

    //Atributos de la entidad Clientes
    private int _iIdCliente;
    private Date _dFecha;

    /*
     * Recupera todo el contenido de la tabla y lo devuelvo en 2 vectores. Uno con los nombres de los campos y
     * otro vector de vectores con los datos propiamente dichos (cada tupla de datos en un vector). El orden de los
     * campos de la fila es el mismo que el de los nombres de los campos.
     */
    public boolean selectAll ( Vector columnIdentifiers, Vector dataVector){
        return this._oClienteDatPers.selectAll (columnIdentifiers, dataVector);
    }

    /*
     * Inserta un registro en la tabla
     */
    public boolean insert ( ){
        if ( !validar () )
            return false;
        //INICIAR TRANSACCION
        GestorBD.getInstancia().abrirTransaccion();
        //Inserto primero en la tabla de clientes principal
        boolean bResultado = this._oClienteDatPers.insert();
        //Actualizo las demás clases con el ID DE CLIENTE generado AUTOMATICAMENTE
        this._oClienteDatSocEco.setiIdCliente( this._oClienteDatPers.getiIdCliente() );
        this._oClienteDatSoc.setiIdCliente( this._oClienteDatPers.getiIdCliente() );
        this._oClienteHob.setiIdCliente( this._oClienteDatPers.getiIdCliente() );
        //Inserto en el resto de las tablas.
        bResultado = bResultado & this._oClienteDatSocEco.insert();
        bResultado = bResultado & this._oClienteDatSoc.insert();
        bResultado = bResultado & this._oClienteHob.insert();
        //CERRAR TRANSACCION
        GestorBD.getInstancia().cerrarTransaccion(bResultado);
        return bResultado;
    }


    /*
     * Actualiza un registro en la entidad auxiliar
     */
    public boolean update (){
        if ( !validar () )
            return false;
        Date fechaHoy = new Date();
        //INICIAR TRANSACCION
        GestorBD.getInstancia().abrirTransaccion();
        //Actualizo primero en la TABLA DE CLIENTES PRINCIPAL
        boolean bResultado = this._oClienteDatPers.update();
        //TABLA CLIENTES DATOS SOCIOECONOMICOS
        //Si la fecha de hoy es igual que la de la clase se hace un update. En caso contrario se genera un
        //registro nuevo (insert).
        if ( Varios.comparaFechas(fechaHoy, this._oClienteDatSocEco.getdFecha()) == 0)
            bResultado = bResultado & this._oClienteDatSocEco.update();
        else{
            //Actualizo el campo fecha
            this._oClienteDatSocEco.setdFecha(fechaHoy);
            bResultado = bResultado & this._oClienteDatSocEco.insert();
        }
        //TABLA CLIENTES DATOS SOCIALES
        //Si la fecha hoy es igual que la de la clase se hace un update. En caso contrario se genera un
        //registro nuevo (insert).
        if ( Varios.comparaFechas(fechaHoy, this._oClienteDatSoc.getdFecha()) == 0)
            bResultado = bResultado & this._oClienteDatSoc.update();
        else{
            //Actualizo el campo fecha
            this._oClienteDatSoc.setdFecha(fechaHoy);
            bResultado = bResultado & this._oClienteDatSoc.insert();
        }
        //TABLA CLIENTES HOBBIES
        //Si la fecha hoy es igual que la de la clase se hace un update. En caso contrario se genera un
        //registro nuevo (insert).
        if ( Varios.comparaFechas(fechaHoy, this._oClienteHob.getdFecha()) == 0)
            bResultado = bResultado & this._oClienteHob.update();
        else{
            //Actualizo el campo fecha
            this._oClienteHob.setdFecha(fechaHoy);
            bResultado = bResultado & this._oClienteHob.insert();
        }
        //CERRAR TRANSACCION
        GestorBD.getInstancia().cerrarTransaccion(bResultado);
        return bResultado;
    }

    /*
     * Borra un registro de la Entidad Auxiliar
     */
    public boolean delete (){
        //INICIAR TRANSACCION
        GestorBD.getInstancia().abrirTransaccion();
        //Borro primero en la tabla de clientes principal
        boolean bResultado = this._oClienteDatPers.delete();
        //Borro en el resto de las tablas.
        bResultado = bResultado & this._oClienteDatSocEco.delete();
        bResultado = bResultado & this._oClienteDatSoc.delete();
        bResultado = bResultado & this._oClienteHob.delete();
        //CERRAR TRANSACCION
        GestorBD.getInstancia().cerrarTransaccion(bResultado);
        return bResultado;
    }

    /*
     * Valida los datos de la clase antes de hacer una inserción/actualización.
     * Se informa de los errores que se produzcan mediante un vector de String.
     */
    public boolean validar (){
        return ( this._oClienteDatPers.validar() &
            this._oClienteDatSoc.validar() &
            this._oClienteDatSocEco.validar() &
            this._oClienteHob.validar());
    }

    /*
     * Carga SOLO los atributos que conforman la clave de la clase a partir de 2 vectores,
     * uno con los nombres de los campos
     * y otro con los valores de los mismos.
     */
    public void vectorJTableAClavesClase ( Vector columnIdentifiers, Vector dataRow ){
        this.inicializa();
        int iIndice = Varios.getPosCadena(columnIdentifiers, "IdCliente");
        this._iIdCliente = Integer.parseInt( dataRow.get(iIndice).toString() );
    }

    /*
     * Devuelve un vector cargado con los atributos de la clase para mostrar en el JTable del panel.
     * El orden de los atributos es el indicado
     * en el vector con los nombres de los campos.
     */
    public Vector claseAVectorJTable ( Vector columnIdentifiers ){
        return this._oClienteDatPers.claseAVectorJTable(columnIdentifiers);
    }

    /*
     * Este método recupera de la tabla un registro cuya clave primaria están cargados en los
     atributos de la clase correspondientes a la clave. Se recuperan los campos del registro y
     se carga el resto de los atributos de la clase.
     */
    public void recupera (){
        this._oClienteDatPers.setiIdCliente(this.getiIdCliente());
        this._oClienteDatPers.recupera();
        //Asigno el id de cliente y la fecha para poder recuperar de la tabla
        this._oClienteDatSoc.setiIdCliente(this.getiIdCliente());
        this._oClienteDatSoc.setdFecha(this.getdFecha());
        this._oClienteDatSoc.recupera();
        //Asigno el id de cliente y la fecha para poder recuperar de la tabla
        this._oClienteDatSocEco.setiIdCliente(this.getiIdCliente());
        this._oClienteDatSocEco.setdFecha(this.getdFecha());
        this._oClienteDatSocEco.recupera();
        //Asigno el id de cliente y la fecha para poder recuperar de la tabla
        this._oClienteHob.setiIdCliente(this.getiIdCliente());
        this._oClienteHob.setdFecha(this.getdFecha());
        this._oClienteHob.recupera();
    }

    public void inicializa (){
        this._iIdCliente = 0;
        this._dFecha = new Date();  //La fecha de hoy

        this._oClienteDatPers.inicializa();
        this._oClienteDatSoc.inicializa();
        this._oClienteDatSocEco.inicializa();
        this._oClienteHob.inicializa();
    }

    public int getiIdCliente() {
        return _iIdCliente;
    }

    public void setiIdCliente(int _iIdCliente) {
        this._iIdCliente = _iIdCliente;
    }

    public ClienteDatPers getoClienteDatPers() {
        return _oClienteDatPers;
    }

    public void setoClienteDatPers(ClienteDatPers _oClienteDatPers) {
        this._oClienteDatPers = _oClienteDatPers;
    }

    public ClienteDatSoc getoClienteDatSoc() {
        return _oClienteDatSoc;
    }

    public void setoClienteDatSoc(ClienteDatSoc _oClienteDatSoc) {
        this._oClienteDatSoc = _oClienteDatSoc;
    }

    public ClienteDatSocEco getoClienteDatSocEco() {
        return _oClienteDatSocEco;
    }

    public void setoClienteDatSocEco(ClienteDatSocEco _oClienteDatSocEco) {
        this._oClienteDatSocEco = _oClienteDatSocEco;
    }

    public ClienteHob getoClienteHob() {
        return _oClienteHob;
    }

    public void setoClienteHob(ClienteHob _oClienteHob) {
        this._oClienteHob = _oClienteHob;
    }

    public String getsNombreTabla() {
        return _sNombreTabla;
    }

    public void setsNombreTabla(String _sNombreTabla) {
        this._sNombreTabla = _sNombreTabla;
    }

    public String getsDescripTabla() {
        return _sDescripTabla;
    }

    public void setsDescripTabla(String _sDescripTabla) {
        this._sDescripTabla = _sDescripTabla;
    }

    public void setsCondWhere(String sCondWhere) {
        this._oClienteDatPers.setsCondWhere (sCondWhere);
    }

    public Date getdFecha() {
        return _dFecha;
    }

    public void setdFecha(Date _dFecha) {
        this._dFecha = _dFecha;
    }
}
